
function xhr(type, url, callback, data) {
      // 如果data是对象 那么我们就需要把data数据进行转换, 转换为字符串; 
      // 如何判定一个数据为对象; 
      // console.log(typeof data);
      // instanceof 关键字 : 
      // 判定实例对象来自于哪个构造函数; 

      // 记住!; 
      if (typeof data === "object" && data !== null && !(data instanceof Array)) {
            var temp = "";
            for (var attr in data) {
                  temp += "&" + attr + "=" + data[attr];
            }
            data = temp.slice(1);
      }

      // 请求方式为get时，同时传递了data数据
      if (type === "GET" && typeof data === "string") {
            // 我们需要去吧data拼接到url上; 
            url += "?" + data;
      }

      var xhr = new XMLHttpRequest();
      xhr.open(type, url);
      // 判定请求方式为post，且携带了data数据; 
      if (type === "POST" && typeof data === "string") {
            xhr.setRequestHeader("content-type", "application/x-www-form-urlencoded");
            xhr.send(data);
      } else {
            xhr.send();
      }
      xhr.onreadystatechange = function () {
            if (xhr.readyState === 4 && xhr.status === 200) {
                  // - 因为在请求结束之后我要做的事情是一坨代码; 
                  // - 我们现在想要把一坨外置，那么我们就需要使用到函数包裹; 
                  callback(xhr.responseText);
            }
      }
}